/*
 * @Author: xiaozhuang-c-language 3535851673@qq.com
 * @Date: 2025-05-03 12:37:58
 * @LastEditors: xiaozhuang-c-language 3535851673@qq.com
 * @LastEditTime: 2025-05-04 10:38:53
 * @FilePath: /zhuang/SemBuilder/Writer.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// #include"SemV1.hpp"
#include"SemV2.hpp"
#include<unistd.h>
#include<ctime>

int main()
{
  srand(time(0)^getpid());
  //1.基于抽象的具体
  shared_ptr<SemaphoreBuilder> builder = make_shared<ConcreteSemaphoreBuilder>();
  //2.指挥者
  shared_ptr<Director> director = make_shared<Director>();
  //3.指挥者指导下进行建造
  director->Construct(builder,BUILD_SEM,0600,3,{1,2,3});
  //4.获取产品
  auto fsem = builder->GetSem();
  pid_t id = fork();
  if(id == 0)
  {
     director->Construct(builder,GET_SEM,0600);
     auto csem = builder->GetSem();
     while(true)
     {
        csem->P(1);
        printf("C");
        usleep(rand()%99530);
        fflush(stdout);
        printf("C");
        usleep(rand()%42350);
        fflush(stdout);
        csem->V(1);
     }
  }

  //child
  while(true)
  {
    fsem->P(1);
    printf("F");
    usleep(rand()%99530);
    fflush(stdout);
    printf("F");
    usleep(rand()%42350);
    fflush(stdout);
    fsem->V(1);
  }

  return 0;
}

// int main()
// {
//     SemBuilderBuilder sb;
//     auto fsem = sb.SetVal(1).build(BUILD_SEM,1);

//     srand(time(0)*getpid());
//     pid_t pid = fork();

//     if(pid == 0)
//     {
//         //child
//        auto csem = sb.build(GET_SEM); //
//        while(true)
//        {
//         csem->P();
//         printf("C");
//         usleep(rand()%95270);
//         fflush(stdout);
//         printf("C");
//         usleep(rand()%43990);
//         fflush(stdout);
//         csem->V();
//        }
//     }

//     //parent
//     while(true)
//     {
//       fsem->P();
//       printf("F");
//       usleep(rand()%95270);
//       fflush(stdout);
//       printf("F");
//       usleep(rand()%43990);
//       fflush(stdout);
//       fsem->V();
//     }

//     return 0;
// }